package Window;

//游戏对战时的算法
import javax.swing.*;
import javax.swing.border.TitledBorder;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class GoBangFrame extends JFrame {

    JButton       nudo = new JButton("悔棋");;        //悔棋
    JButton       newGame =  new JButton("开始游戏");;     //新游戏
    JCheckBox     showNumber =  new JCheckBox();;  //显示数字
    GoBangPanel goBangPanel;
    JRadioButton  renren = new JRadioButton("人人");      //人人对战
    JRadioButton  renji = new JRadioButton("人机");       //人机对战
    JRadioButton  guZhi;       //估值函数
    JRadioButton  souSuoShu;   //搜索树

    public static JRadioButton  human;   //人类先手
    public static JRadioButton  robot;   //机器先手

    JComboBox<Integer> jComboBox1;  //搜索深度
    JComboBox<Integer> jComboBox2;  //搜索节点
    boolean show = true;

    //大致的菜单
    public void Menu() {
        JMenuBar menuBar = new JMenuBar();
        // 创建菜单
        JMenu fileMenu = new JMenu("菜单");
        // 创建 其他
        JMenu elseUsMenu = new JMenu("其他");

        elseUsMenu.setFont(new Font("宋体", Font.PLAIN, 20));
        fileMenu.setFont(new Font("宋体", Font.PLAIN, 20));

        // 创建菜单项
        JMenuItem modeItem = new JMenuItem("模式/难度 选择");
        JMenuItem showItem = new JMenuItem("显示下棋的顺序");
       // JMenuItem personItem = new JMenuItem("人人对决");
        JMenuItem regretItem = new JMenuItem("悔棋");
        JMenuItem helpItem = new JMenuItem("帮助");
        JMenuItem setItem = new JMenuItem("关闭背景音乐");
        JMenuItem exitItem = new JMenuItem("退出游戏");

        showItem.setFont(new Font("宋体", Font.PLAIN, 20));
        regretItem.setFont(new Font("宋体", Font.PLAIN, 20));
        helpItem.setFont(new Font("宋体", Font.PLAIN, 20));
        exitItem.setFont(new Font("宋体", Font.PLAIN, 20));
        modeItem.setFont(new Font("宋体", Font.PLAIN, 20));
        setItem.setFont(new Font("宋体", Font.PLAIN, 20));

        // 将菜单项添加到菜单中
        fileMenu.add(modeItem);
        fileMenu.add(helpItem);
        fileMenu.add(exitItem);

        elseUsMenu.add(setItem);

        // 为菜单项添加事件监听器
        showItem.addActionListener(e -> {

            int level = (Integer) jComboBox1.getSelectedItem();//获取深度值。
            int node = (Integer) jComboBox2.getSelectedItem();//获取每层的节点

            //默认level = 3 node = 3
            level = 3; node = 3;

            goBangPanel.playNewGame(showNumber.isSelected(), renren.isSelected(), renji.isSelected(), level, node,
                    guZhi.isSelected(), souSuoShu.isSelected(), robot.isSelected());
        });

        regretItem.addMouseListener(mouseListener);
        setItem.addActionListener(e -> {
            if (setItem.getText().equals("关闭背景音乐")) {
                setItem.setText("开启背景音乐");
                OnlinebattlePanel.clip.stop();
            } else {
                setItem.setText("关闭背景音乐");
                OnlinebattlePanel.clip.start(); // 开启背景音乐
            }
        });
        //帮助文档
        helpItem.addActionListener(e -> {
            // 创建新的 JFrame
            JFrame helpFrame = new JFrame("五子棋帮助");

            // 设置窗口大小
            helpFrame.setSize(500, 600);
            helpFrame.setLocationRelativeTo(null);

            // 创建文本标签，显示五子棋的帮助信息 用html去和GUI结合
            String helpText = "<html><h2>五子棋帮助</h2>"
                    + "<p>五子棋是一种两人对弈的纯策略型棋类游戏</p>"
                    + "<p>玩家轮流在棋盘上下子，先形成连续的五个同色棋子的一方获胜</p>"
                    + "<p>游戏规则：</p>"
                    + "<ul>"
                    + "<li>黑方先行，双方轮流落子</li>"
                    + "<li>每次落子后，判断是否有一方已经获胜</li>"
                    + "<li>获胜条件：连续的五个同色棋子，可以是横线、竖线、斜线</li>"
                    + "<li>如果棋盘填满，且没有任何一方获胜，则为平局</li>"
                    + "</ul>"
                    + "<p>祝您玩得愉快！</p></html>";

            JLabel helpLabel = new JLabel(helpText);
            helpLabel.setHorizontalAlignment(JLabel.CENTER);
            helpLabel.setFont(new Font("宋体", Font.PLAIN, 16));

            // 创建 JPanel 组件，并设置布局管理器为 BorderLayout
            JPanel panel = new JPanel(new BorderLayout());

            // 将文本标签添加到面板中
            panel.add(helpLabel, BorderLayout.CENTER);

            // 设置窗口的内容面板为 JPanel
            helpFrame.setContentPane(panel);

            // 设置窗口可见
            helpFrame.setVisible(true);
        });

        //退出游戏 待更新
        exitItem.addActionListener(e->{
            //在给用户一个互动 更合理化点
            System.exit(-1);
        });

    modeItem.addActionListener(e->{

        JFrame frame = new JFrame();
        frame.setSize(500, 600);
        frame.setLocation(400, 400);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        JPanel rightPanel = new JPanel();          //界面右侧的功能区
        rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.Y_AXIS)); // 指定了布局方向为垂直（Y_AXIS）

        // 模式
        JPanel jPanel2 = new JPanel();
        jPanel2.setBorder(new TitledBorder("模式"));
        ButtonGroup bg = new ButtonGroup(); // 两个选框互斥
        renji.setSelected(true);
        bg.add(renren);
        bg.add(renji);
        jPanel2.add(renren);
        jPanel2.add(renji);
        rightPanel.add(jPanel2);

        // 智能
        JPanel jPanel3 = new JPanel();
        jPanel3.setBorder(new TitledBorder("智能"));//给jPanel3面板设置一个标题为"智能"的边框样式。通过设置边框样式，使界面更加美观。
        ButtonGroup bg1 = new ButtonGroup(); // 互斥 多选按钮只能选择一个
        guZhi = new JRadioButton("估值函数");
        guZhi.setSelected(true);
        souSuoShu = new JRadioButton("搜索树");
        bg1.add(guZhi);
        jPanel3.add(guZhi);
        rightPanel.add(jPanel3);

        // 搜索树
        JPanel jPanel4 = new JPanel();
        jPanel4.setBorder(new TitledBorder("搜索树"));//如果这个显示的话 就显的不好看了
        JLabel jLabel1 = new JLabel("搜索深度：");
        jComboBox1 = new JComboBox<Integer>(new Integer[] { 1, 2, 3 });
        JLabel jLabel2 = new JLabel("每层节点：");//层数越深 ai越容易赢 但是需要的时间越多
        jComboBox2 = new JComboBox<Integer>(new Integer[] { 3, 5, 10 });
        jPanel4.add(jLabel1);
        jPanel4.add(jComboBox1);
        jPanel4.add(jLabel2);
        jPanel4.add(jComboBox2);
//        rightPanel.add(jPanel4);

        // 人机模式
        JPanel jPanel6 = new JPanel();
        jPanel6.setBorder(new TitledBorder("人机模式"));
        ButtonGroup bg2 = new ButtonGroup();
        human = new JRadioButton("人类先手");
        robot = new JRadioButton("机器先手");
        robot.setSelected(true);
        bg2.add(human);
        bg2.add(robot);
        jPanel6.add(human);
        jPanel6.add(robot);
        rightPanel.add(jPanel6);

        newGame = new JButton("开始游戏");
        rightPanel.add(newGame);
        newGame.addMouseListener(mouseListener);  // 添加事件
        frame.add(rightPanel);

        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        newGame.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                frame.dispose(); // 关闭窗口
            }
        });
    });

        // 将菜单添加到菜单栏中
        menuBar.add(fileMenu);
        menuBar.add(elseUsMenu);
        // 将菜单栏设置为窗口的菜单栏
        this.setJMenuBar(menuBar);

        // 设置窗口可见
        this.setVisible(true);
    }

    public void start() {//开始
        Menu();
        goBangPanel = new GoBangPanel();//构造方法，初始化
        //BorderLayout布局管理器，用于将组件按照东、西、南、北和中间的方式进行布局。
        this.add(goBangPanel, BorderLayout.WEST);  // 界面左侧棋盘

        JPanel rightPanel = new JPanel();          //界面右侧的功能区
        rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.Y_AXIS)); // 指定了布局方向为垂直（Y_AXIS）


        // 其他
        JPanel jPanel5 = new JPanel();
        JLabel jLabel3 = new JLabel("显示落子顺序：");

        jPanel5.add(jLabel3);
        jPanel5.add(showNumber);
        showNumber.addMouseListener(mouseListener);
        nudo.addMouseListener(mouseListener);    // 添加事件
        jPanel5.add(nudo);
        rightPanel.add(jPanel5);

        this.add(rightPanel);

        this.setTitle("星辰对决");    // 标题
        this.setSize(GoBangUtil.GAME_WIDTH, GoBangUtil.GAME_HEIGHT); // 大小
        this.setLocation(450, 150);   // 初始化位置
        this.setResizable(false);     // 不可伸缩
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }

    //鼠标监听事件 点击之后 要做变化的 重写方法
    private MouseListener mouseListener = new MouseListener() {
        @Override
        public void mouseClicked(MouseEvent e) {//点击了哪一个?
            Object object = e.getSource();
            if (object == nudo) {//悔棋
               // System.out.println("!!!");
                if (renren.isSelected()) {//看看谁被选上了
                    goBangPanel.huiQi();//人人的悔棋
                } else if (renji.isSelected()) {
                    goBangPanel.huiQi2();//人机的悔棋
                }
            } else if (object == newGame) {   // 新游戏
                GoBangPanel.startX = GoBangPanel.startY = GoBangPanel.endX = GoBangPanel.endY = 0;
                int level = (Integer) jComboBox1.getSelectedItem();//获取深度值。
                int node = (Integer) jComboBox2.getSelectedItem();//获取每层的节点
                goBangPanel.playNewGame(showNumber.isSelected(), renren.isSelected(), renji.isSelected(), level, node,
                        guZhi.isSelected(), souSuoShu.isSelected(), robot.isSelected());
            } else if (object == showNumber) {   // 显示数字
                goBangPanel.shouOrderNumber(showNumber.isSelected());//把数字给显示出来
            }
        }

        @Override
        public void mousePressed(MouseEvent e) {
        }

        @Override
        public void mouseReleased(MouseEvent e) {
        }

        @Override
        public void mouseEntered(MouseEvent e) {
        }

        @Override
        public void mouseExited(MouseEvent e) {
        }
    };

}